library('ggplot2')
library(readr)
library(grid)
library(gridExtra)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
## X1 = col_integer(),
## fixed.acidity = col_double(),
## volatile.acidity = col_double(),
## citric.acid = col_double(),
## residual.sugar = col_double(),
## chlorides = col_double(),
## free.sulfur.dioxide = col_double(),
## total.sulfur.dioxide = col_integer(),
## density = col_double(),
## pH = col_double(),
## sulphates = col_double(),
## alcohol = col_double(),
## quality = col_integer()
## )
## Warning in rbind(names(probs), probs_f): number of columns of result is not
## a multiple of vector length (arg 1)
## Warning: 2 parsing failures.
## row # A tibble: 2 x 5 col row col expected actual expected <int> <chr> <chr> <chr> actual 1 1296 total.sulfur.dioxide no trailing characters .5 file 2 1297 total.sulfur.dioxide no trailing characters .5 row # ... with 1 more variables: file <chr>
Essas funções foram criadas para facilitar o entendimento do código e também diminuir seu tamanho na hora da criação dos gráficos.
#funcao que retorna o nome das colunas
names(wineQualityReds)
## [1] "X1" "fixed.acidity" "volatile.acidity"
## [4] "citric.acid" "residual.sugar" "chlorides"
## [7] "free.sulfur.dioxide" "total.sulfur.dioxide" "density"
## [10] "pH" "sulphates" "alcohol"
## [13] "quality"
## X1 fixed.acidity volatile.acidity citric.acid
## Min. : 1.0 Min. : 4.60 Min. :0.1200 Min. :0.000
## 1st Qu.: 400.5 1st Qu.: 7.10 1st Qu.:0.3900 1st Qu.:0.090
## Median : 800.0 Median : 7.90 Median :0.5200 Median :0.260
## Mean : 800.0 Mean : 8.32 Mean :0.5278 Mean :0.271
## 3rd Qu.:1199.5 3rd Qu.: 9.20 3rd Qu.:0.6400 3rd Qu.:0.420
## Max. :1599.0 Max. :15.90 Max. :1.5800 Max. :1.000
##
## residual.sugar chlorides free.sulfur.dioxide
## Min. : 0.900 Min. :0.01200 Min. : 1.00
## 1st Qu.: 1.900 1st Qu.:0.07000 1st Qu.: 7.00
## Median : 2.200 Median :0.07900 Median :14.00
## Mean : 2.539 Mean :0.08747 Mean :15.87
## 3rd Qu.: 2.600 3rd Qu.:0.09000 3rd Qu.:21.00
## Max. :15.500 Max. :0.61100 Max. :72.00
##
## total.sulfur.dioxide density pH sulphates
## Min. : 6.00 Min. :0.9901 Min. :2.740 Min. :0.3300
## 1st Qu.: 22.00 1st Qu.:0.9956 1st Qu.:3.210 1st Qu.:0.5500
## Median : 38.00 Median :0.9968 Median :3.310 Median :0.6200
## Mean : 46.43 Mean :0.9967 Mean :3.311 Mean :0.6581
## 3rd Qu.: 62.00 3rd Qu.:0.9978 3rd Qu.:3.400 3rd Qu.:0.7300
## Max. :289.00 Max. :1.0037 Max. :4.010 Max. :2.0000
## NA's :2
## alcohol quality
## Min. : 8.40 Min. :3.000
## 1st Qu.: 9.50 1st Qu.:5.000
## Median :10.20 Median :6.000
## Mean :10.42 Mean :5.636
## 3rd Qu.:11.10 3rd Qu.:6.000
## Max. :14.90 Max. :8.000
##
Removendo os valores NA’s da coluna total.sulfur.dioxide:
#removendo os valores NA
wineQualityReds <- na.omit(wineQualityReds)
summary(wineQualityReds)
## X1 fixed.acidity volatile.acidity citric.acid
## Min. : 1.0 Min. : 4.600 Min. :0.1200 Min. :0.0000
## 1st Qu.: 400.0 1st Qu.: 7.100 1st Qu.:0.3900 1st Qu.:0.0900
## Median : 799.0 Median : 7.900 Median :0.5200 Median :0.2600
## Mean : 799.4 Mean : 8.322 Mean :0.5277 Mean :0.2713
## 3rd Qu.:1198.0 3rd Qu.: 9.200 3rd Qu.:0.6400 3rd Qu.:0.4200
## Max. :1599.0 Max. :15.900 Max. :1.5800 Max. :1.0000
## residual.sugar chlorides free.sulfur.dioxide
## Min. : 0.900 Min. :0.01200 Min. : 1.00
## 1st Qu.: 1.900 1st Qu.:0.07000 1st Qu.: 7.00
## Median : 2.200 Median :0.07900 Median :14.00
## Mean : 2.537 Mean :0.08746 Mean :15.83
## 3rd Qu.: 2.600 3rd Qu.:0.09000 3rd Qu.:21.00
## Max. :15.500 Max. :0.61100 Max. :72.00
## total.sulfur.dioxide density pH sulphates
## Min. : 6.00 Min. :0.9901 Min. :2.740 Min. :0.3300
## 1st Qu.: 22.00 1st Qu.:0.9956 1st Qu.:3.210 1st Qu.:0.5500
## Median : 38.00 Median :0.9968 Median :3.310 Median :0.6200
## Mean : 46.43 Mean :0.9967 Mean :3.311 Mean :0.6584
## 3rd Qu.: 62.00 3rd Qu.:0.9978 3rd Qu.:3.400 3rd Qu.:0.7300
## Max. :289.00 Max. :1.0037 Max. :4.010 Max. :2.0000
## alcohol quality
## Min. : 8.40 Min. :3.000
## 1st Qu.: 9.50 1st Qu.:5.000
## Median :10.20 Median :6.000
## Mean :10.42 Mean :5.637
## 3rd Qu.:11.10 3rd Qu.:6.000
## Max. :14.90 Max. :8.000
O primeiro gráfico que farei é um histograma simples utilizando a qualidade do vinho como eixo X. Quero saber qual é o nível dos vinhos em nosso dataset!
Como podemos ver, a maioria dos vinhos em nosso dataset é de qualidade ou 5 ou 6, ou seja, são um pouco acima da média já que a escala é de 0 a 8.
Vamos olhar rapidamente para as outras variáveis!
#nesse trecho de codigo crio 8 graficos, uum por variavel e depois exibo-os em agrupamentos de 4 graficos cada
plot_fix_acid <- ggplot(wineQualityReds, aes(x = fixed.acidity)) +
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('Fixed Acidity (g / dm^3)') +
labs(title='2- Fixed Acidity Histogram')
plot_vol_acid <- ggplot(wineQualityReds, aes(x = volatile.acidity))+
ylab('Frequency') +
xlab('Volatile Acidity (g / dm^3)') +
labs(title='3- Volatile Acidity Histogram') +
geom_histogram(fill = "#3366FF",bins = 100)
plot_cit_acid <- ggplot(wineQualityReds, aes(x = citric.acid))+
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('Citric Acid (g / dm^3)') +
labs(title='4- Citric Acid Histogram')
plot_res_sugar <- ggplot(wineQualityReds, aes(x = residual.sugar))+
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('Residual Sugar (g / dm^3)') +
labs(title='5- Residual Sugar Histogram')
plot_chlorides <- ggplot(wineQualityReds, aes(x = chlorides))+
geom_histogram(color = "white", fill = "#3366FF", bins = 50) +
ylab('Frequency') +
xlab('Chlorides (g / dm^3)') +
labs(title='6- Chlorides Histogram')
plot_so2 <- ggplot(wineQualityReds, aes(x = total.sulfur.dioxide))+
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('SO2 (g / dm^3)') +
labs(title='7- SO2 Histogram')
plot_ph <- ggplot(wineQualityReds, aes(x = pH))+
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('pH') +
labs(title='8- pH Histogram') +
scale_x_continuous(breaks = seq(0,4,0.2))
plot_alcohol <- ggplot(wineQualityReds, aes(x = alcohol))+
geom_histogram(color = "white", fill = "#3366FF") +
ylab('Frequency') +
xlab('Alcohol (% by volume)') +
labs(title='9- Alcohol Histogram')
grid.arrange(plot_fix_acid, plot_vol_acid, plot_cit_acid, plot_res_sugar, ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
grid.arrange(plot_chlorides, plot_so2, plot_ph, plot_alcohol, ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Para descobrirmos quais são os principais atributos aqui, vamos verificar quais tem que correlação com a coluna quality. Para isso existe a função cor() do r. Quão mais próximo o valor for de 1, mais positivamente é a correlação, ou seja, quão maior o valor da variável, maior será o da target. E assim é para quão mais próximo de -1, no caso seria inversamente proporcional.
## X1 fixed.acidity volatile.acidity
## 0.06758909 0.12320006 -0.39022587
## citric.acid residual.sugar chlorides
## 0.22536054 0.01498493 -0.12884172
## free.sulfur.dioxide total.sulfur.dioxide density
## -0.04769854 -0.18434369 -0.17563963
## pH sulphates alcohol
## -0.05848341 0.25051925 0.47572001
## quality
## 1.00000000
Como podemos observar, os principais atributos desse conjunto de dados são o alcohol, sulphates, volatile.acidity e citric.acid
Sobre a coluna quality, irei criar uma label com três valores: - Ruim: (4,5] - Bom: (5,6] - Ótimo: (7,8]
#criando uma coluna nova
wineQualityReds$quality.label <- cut(wineQualityReds$quality, c(3, 4, 6, 10),
labels = c("ruim", "bom", "ótimo"),
include.lowest = T)
summary(wineQualityReds$quality.label)
## ruim bom ótimo
## 63 1317 217
Vamos olhar quais atributos são mais relevantes para cada uma das três variáveis mencionadas acima! :)
# a funcao cor() retorna a correlacao entre as variaveis com a sua target, que eh passada como parametro
cor(wineQualityReds[,-14])[,'citric.acid']
## X1 fixed.acidity volatile.acidity
## -0.15197133 0.67120591 -0.55228351
## citric.acid residual.sugar chlorides
## 1.00000000 0.14607451 0.20427744
## free.sulfur.dioxide total.sulfur.dioxide density
## -0.05558572 0.03724338 0.36439884
## pH sulphates alcohol
## -0.54399501 0.31130106 0.10857619
## quality
## 0.22536054
Aqui podemos ver que o que mais influencia é o atributo fixed.acidity, podemos perceber também o o pH tem grande influência nessa variável, porém de maneira negativa.
cor(wineQualityReds[,-14])[,'sulphates']
## X1 fixed.acidity volatile.acidity
## -0.123859096 0.181768671 -0.260407811
## citric.acid residual.sugar chlorides
## 0.311301059 0.007463648 0.371796054
## free.sulfur.dioxide total.sulfur.dioxide density
## 0.057284788 0.044465293 0.147730164
## pH sulphates alcohol
## -0.198006469 1.000000000 0.092392709
## quality
## 0.250519246
O que mais tem influência sob esse atributo é o citric.acid
cor(wineQualityReds[,-14])[,'alcohol']
## X1 fixed.acidity volatile.acidity
## 0.24658445 -0.06280815 -0.20180471
## citric.acid residual.sugar chlorides
## 0.10857619 0.04349416 -0.22111881
## free.sulfur.dioxide total.sulfur.dioxide density
## -0.06626454 -0.20484057 -0.49720344
## pH sulphates alcohol
## 0.20501427 0.09239271 1.00000000
## quality
## 0.47572001
Aqui o ph é o que mais tem influência nesse atributo!
Relembrando: - fixed.acidity - chlorides - ph - sulphates
Agora que listamos as outras quatro variáveis que serão usadas, mais à frente iremos analisá-las também!
Vou fazer algumas análises abaixo para verificarmos a relação entre duas variáveis :)
Primeiro irei utilizar da biblioteca lsr, a função correlate que me dá a relação entre duas variávies!
##
## CORRELATIONS
## ============
## - correlation type: pearson
## - correlations shown only when both variables are numeric
##
## X1 fixed.acidity volatile.acidity citric.acid
## X1 . -0.268 -0.010 -0.152
## fixed.acidity -0.268 . -0.256 0.671
## volatile.acidity -0.010 -0.256 . -0.552
## citric.acid -0.152 0.671 -0.552 .
## residual.sugar -0.033 0.117 0.001 0.146
## chlorides -0.120 0.094 0.061 0.204
## free.sulfur.dioxide 0.087 -0.151 -0.013 -0.056
## total.sulfur.dioxide -0.119 -0.112 0.076 0.037
## density -0.368 0.668 0.022 0.364
## pH 0.137 -0.685 0.236 -0.544
## sulphates -0.124 0.182 -0.260 0.311
## alcohol 0.247 -0.063 -0.202 0.109
## quality 0.068 0.123 -0.390 0.225
## quality.label . . . .
## residual.sugar chlorides free.sulfur.dioxide
## X1 -0.033 -0.120 0.087
## fixed.acidity 0.117 0.094 -0.151
## volatile.acidity 0.001 0.061 -0.013
## citric.acid 0.146 0.204 -0.056
## residual.sugar . 0.055 0.183
## chlorides 0.055 . 0.005
## free.sulfur.dioxide 0.183 0.005 .
## total.sulfur.dioxide 0.202 0.047 0.669
## density 0.357 0.201 -0.019
## pH -0.085 -0.265 0.074
## sulphates 0.007 0.372 0.057
## alcohol 0.043 -0.221 -0.066
## quality 0.015 -0.129 -0.048
## quality.label . . .
## total.sulfur.dioxide density pH sulphates alcohol
## X1 -0.119 -0.368 0.137 -0.124 0.247
## fixed.acidity -0.112 0.668 -0.685 0.182 -0.063
## volatile.acidity 0.076 0.022 0.236 -0.260 -0.202
## citric.acid 0.037 0.364 -0.544 0.311 0.109
## residual.sugar 0.202 0.357 -0.085 0.007 0.043
## chlorides 0.047 0.201 -0.265 0.372 -0.221
## free.sulfur.dioxide 0.669 -0.019 0.074 0.057 -0.066
## total.sulfur.dioxide . 0.072 -0.066 0.044 -0.205
## density 0.072 . -0.342 0.148 -0.497
## pH -0.066 -0.342 . -0.198 0.205
## sulphates 0.044 0.148 -0.198 . 0.092
## alcohol -0.205 -0.497 0.205 0.092 .
## quality -0.184 -0.176 -0.058 0.251 0.476
## quality.label . . . . .
## quality quality.label
## X1 0.068 .
## fixed.acidity 0.123 .
## volatile.acidity -0.390 .
## citric.acid 0.225 .
## residual.sugar 0.015 .
## chlorides -0.129 .
## free.sulfur.dioxide -0.048 .
## total.sulfur.dioxide -0.184 .
## density -0.176 .
## pH -0.058 .
## sulphates 0.251 .
## alcohol 0.476 .
## quality . .
## quality.label . .
Legal né? Mas é uma tabela, então é dificil tirar uma conclusão rápida!
Abaixo vou fazer um plot disso e você vai poder perceber o quão mais fácil fica :)
library(ellipse)
#craete new dataframe without categorical vars
numeric_vars <- names(wineQualityReds) %in% c("quality.label", "rn")
rw_num <- wineQualityReds[!numeric_vars]
ctab <- cor(rw_num)
#plot which show correlation in more convenient way
colorfun <- colorRamp(c("#CC0000", "white", "#3366CC"), space = "Lab")
plotcorr(ctab, mar = c(0, 0, 0, 0), col = rgb(colorfun((ctab + 1) / 2),
maxColorValue = 255))
Apenas uma explicação rápida, quanto mais azul e mais inclinado para a direita, mais positivamente correlacionada as variáveis são. E quanto mais vermelho e mais inclinado para a esquerda, mais negativamente correlacionadas elas são!
Só de bater o olho já conseguimos ver 4 fortes correlações (2 positivas e 2 negativas) :)
Abaixo um resumo por variável:
E a nossa principal:
Vamos aqui olhar variável à variável em relação à nossa de qualidade :)
box_plot_func(y_str = "citric.acid",
yl = "Citric acid (g / dm^3)",
t = "Ácido Cítrico pela Qualidade")
by(wineQualityReds$citric.acid, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0200 0.0800 0.1737 0.2700 1.0000
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0900 0.2400 0.2587 0.4000 0.7900
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.3000 0.4000 0.3765 0.4900 0.7600
Muito bom esse plot! Podemos ver que existem pouqíssimos outliers :D Além disso, pode-se perceber que realmente essa coluna tem uma influência na qualidade do vinho
box_plot_func(y_str = "total.sulfur.dioxide",
yl = "Total SO2 (g / dm^3)",
t = "SO2 pela Qualidade")
by(wineQualityReds$total.sulfur.dioxide, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 13.50 26.00 34.44 48.00 119.00
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.0 24.0 40.0 48.9 65.0 165.0
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 17.00 27.00 34.89 43.00 289.00
Aqui podemos já perceber que existem diversos outliers. Além disso não há muito o que comentar, já que possue um comportamento um tanto quanto similar entre os tipos de vinho.
box_plot_func(y_str = "residual.sugar",
yl = "Residual Sugar (g / dm^3)",
t = "Açúcar pela Qualidade")
by(wineQualityReds$residual.sugar, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.200 1.900 2.100 2.685 2.950 12.900
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.900 1.900 2.200 2.501 2.600 15.500
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.200 2.000 2.300 2.709 2.700 8.900
Existem muitos outliers, principalmente em vinhos bons, mas no geral essa coluna tem um comportamento similar entre os diversos tipos.
box_plot_func(y_str = "pH",
yl = "pH",
t = "pH pela Qualidade")
by(wineQualityReds$pH, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.740 3.300 3.380 3.384 3.500 3.900
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.860 3.210 3.310 3.311 3.400 4.010
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.880 3.200 3.270 3.289 3.380 3.780
Existem alguns outliers, principalmente em vinhos bons, mas no geral essa coluna tem um comportamento similar entre os diversos tipos.
box_plot_func(y_str = "total.sulfur.dioxide",
yl = "Total SO2 (g / dm^3)",
t = "SO2 pela Qualidade")
by(wineQualityReds$total.sulfur.dioxide, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 13.50 26.00 34.44 48.00 119.00
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.0 24.0 40.0 48.9 65.0 165.0
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.00 17.00 27.00 34.89 43.00 289.00
Por incrível que pareça, vinhos classificados como ótimos e ruins possuem um comportamento similar para essa variável. Além disso existem alguns outliers, principalmentes nos vinhos classificados como ótimos.
box_plot_func(y_str = "alcohol",
yl = "Álcool (% of volume)",
t = "Álcool pela Qualidade")
by(wineQualityReds$alcohol, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.40 9.60 10.00 10.22 11.00 13.10
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.40 9.50 10.00 10.25 10.90 14.90
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.20 10.80 11.60 11.52 12.20 14.00
Aqui conseguimos ver que os vinhos classificados como ótimos possuem uma quantidade maior de álcool em sua composição. Vinhos bons e ruins são praticamente idênticos.
box_plot_func(y_str = "sulphates",
yl = "Sulphates (g / dm^3)",
t = "Sulphates by Quality")
by(wineQualityReds$sulphates, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3300 0.4950 0.5600 0.5922 0.6000 2.0000
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3700 0.5400 0.6100 0.6476 0.7000 1.9800
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3900 0.6500 0.7400 0.7435 0.8200 1.3600
Muito legal essa variável, podemos ver que ela possui um comportamento diferente para as três classificações de qualidade :)
box_plot_func(y_str = "chlorides",
yl = "Chlorides (g / dm^3)",
t = "Chlorides by Quality")
by(wineQualityReds$chlorides, wineQualityReds$quality.label, summary)
## wineQualityReds$quality.label: ruim
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.04500 0.06850 0.08000 0.09573 0.09450 0.61000
## --------------------------------------------------------
## wineQualityReds$quality.label: bom
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.03400 0.07100 0.08000 0.08897 0.09100 0.61100
## --------------------------------------------------------
## wineQualityReds$quality.label: ótimo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01200 0.06200 0.07300 0.07591 0.08500 0.35800
Possui um comportamento um tanto quanto similar entre as qualidades boa e ruim, mas já para a ótima ela tem um comportamento diferente :)
Aprentemente a qualidade do vinho depende das seguintes características: - Álcool - Sulfatos - Volatilidade do ácido - Ácido cítrico
Não consegui tirar nenhuma conclusão a partir desse gráfico.
Essa visualização ficou um tanto quanto poluída né? Irei refazê-la, porém excluindo os vinhos bons… vamos ver como que fica!
Agora já fica muito mais claro uma conclusão :) Podemos ver claramente que em geral os vinhos classificados como ruins possuem uma quantidade menor de sulphates e um pH relativamente mais alto em alguns casos.
Aparentemente, vinhos com um pH menor do que 3.5 e com mais de 0.25 de ácido cítrico tendem a ter uma qualidade superior aos outros :)
Parece que vinhos bons tem menos de 50g de SO2 em sua composição! Mais uma evidencia :)
Aqui com esse gráfico fica bem claro que vinhos bons, em geral, possuem uma gradação alcóolica maior do que 10% e sulphates maior do que 0.6
density_plot_func(col = "quality.label",
x_str = "alcohol",
xl = "Alcohol (% of volume)",
t = "Alcohol density\n by quality rank",
lt = "Quality")+
theme(legend.justification = c(1, 1),
legend.position = c(1, 1))
A ideia da criação de gráfico foi para olhar um pouco mais a fundo em uma das variáveis que mais impactam na qualidade do vinho, o álcool. Quis mostrar os diferentes níveis de percentual alcóolico em vinhos bons, ruins e ótimos. Nitidamente vemos que vinhos bons possuem um percentual alcóolico maior em relação aos outros :)
Além do gráfico, podemos ver na tabela abaixo que realmente existe uma diferença entre cada tipo de vinho :)
A distribuição dos vinhos ótimos e bons é unimodal, enquanto que a de vinhos ruins é bimodal. A maior concentração do teor alcóolico em vinhos bons está em pouco menos de 10%, enquanto que vinhos ótimos está perto de 12%.
final_plot_two_1 = ggplot(data = wineQualityReds,
aes(x = quality.label,
y = sulphates,
fill = quality.label)) +
geom_boxplot() +
xlab("Quality rank") +
ylab("Sulphates (g / dm^3)") +
ggtitle("Sulphates by quality rank") +
coord_cartesian(ylim = c(0.4, 0.9)) +
theme(legend.justification = c(1, 0),
legend.position = c(1, 0))
final_plot_two_2 = point_plot_func(x_str = "citric.acid",
y_str = "sulphates",
yl = "Sulphates (g / dm^3)",
xl = "Citric Acid (g / dm^3)",
t = "Sulphates vs Citric Acid by Quality") +
coord_cartesian(ylim = c(0.2, 1.2)) +
theme(legend.justification = c(1, 0),
legend.position = c(1, 0))
grid.arrange(final_plot_two_1, final_plot_two_2, ncol = 2)
O comportamento da variável sulphates tem um comportamento bem diferente em relação aos três tipos, isso é muito bom :)
No segundo gráfico vemos que em geral, vinhos bons possuem o nível de sulphates maior do que 0.6.
Outra observação é em relação ao segundo gráfico, que mostra a relação entre o nível de sulphates e citric.acid. Podemos perceber que vinhos classicados como ótimo em geral possuem um maior nível de citric.acid e também de sulphates.
Um ponto de observação é em relação ao gráfico Sulphates vc Citric Acid by Quality. Ele está um tanto quanto poluído. Irei fazê-lo novamente, porém agora somente com vinhos ótimos e ruins:
plotData = subset(wineQualityReds, quality.label != 'bom')
ggplot( data = plotData, aes_string(x = plotData$citric.acid,
y = plotData$sulphates,
color = plotData$quality.label)) +
geom_point(size = 3, alpha = 0.5, position = "jitter")+
xlab('Citric Acid (g / dm^3)')+
ylab('Sulphates (g / dm^3)')+
ggtitle('Sulphates vc Citric Acid by Quality') +
scale_color_brewer(palette="Set1", guide = guide_legend(title = 'Quality', reverse = T))
Agora sim conseguimos ver de maneira clara como essas duas variáveis estão relacionadas e interferem na qualidade do vinho! :) Basicamente quando o nível de sulphates é menor do que 0.6, o vinho, em geral, não é de qualidade boa! (como mencionei acima)
ggplot()+
geom_point(alpha = 0.5,
data = wineQualityReds,
aes(x = volatile.acidity,
y = citric.acid,
color = quality.label),
size = 2) +
scale_x_continuous(breaks = seq(0, 1.6, 0.2)) +
ylab("Citric acid (g / dm^3)") +
xlab("Volatle acidity (g / dm^3)") +
ggtitle("Citric acid vs Volatile acidity by quality rank") +
scale_color_brewer(palette = "Spectral",
type = 'div',
guide = guide_legend(title = 'Quality', reverse = T)) +
theme(plot.title = element_text(size = 12),
legend.justification = c(1, 1),
legend.position = c(1, 1))
A ideia de fazer esse gráfico foi verificar a relação entre as variáveis citric.acid e volatile.acidity nos diferentes níveis de qualidade. Podemos ver claramente que quão menor o nível de volatile.acidity e maior o de citric.acid, melhor será a qualidade do vinho. Vinhos classificados como ruins tem um alto valor de volatile.acidity e um baixíssimo de citric.acid :)
Quando vi que teria a oportunidade de estudar esse dataset eu fiquei muito animado! Não sou um grande entendedor de vinhos, mas sou de família italiana, ou seja, ao invés de sangue é vinho que corre em minhas veias :P
Confesso que ao iniciar esse projeto eu não fazia ideia do que mais tem influência na qualidade. Aí para ver isso já de maneira bem rápida, eu usei a função cor(), que me mostrou que as variáveis que mais influenciam são SO2, sulphates, pH, acidity e alcohol.
Para comprovar isso, fiz todos os gráficos. E analisando-os, realmente vi que os vinhos de qualidade boa se concentram em determinadas regiões dos gráficos para cada variável.
Tive algumas dificuldades durante o processo, principalmente por não entender direito o comportamento de cada variável na qualidade do vinho. Eu realmente não sabia por onde começar, por quais variáveis combinar e assim por diante! Conhecer pacotes como o cor() foi essencial para que eu conseguisse realizar esse projeto :)
Como sugestão para um trabalho futuro, acho que seria bem legal adicionar uma variável que seria o tipo do vinho e a região de onde ele foi feito. Pelo menos eu acho que a região tem um fator relativamente importante na qualidade … Ahh, outra coisa, a safra, i.é, o mês que ele foi produzido.. acho que cruzar isso com dados metereológicos pode dar muitos insights :)